//相交链表
/*给定两个单链表的头节点 headA 和 headB ，请找出并返回两个单链表相交的起始节点。如果两个链表没有交点，返回 null 。*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
        if (headA == nullptr || headB == nullptr)
            return nullptr;
        int A_count = 1;
        int B_count = 1;
        ListNode* _headA = headA;
        ListNode* _headB = headB;
        while (_headA->next) {
            A_count++;
            _headA = _headA->next;
        }
        while (_headB->next) {
            B_count++;
            _headB = _headB->next;
        }
        if (_headA == _headB) {
            while (A_count != B_count) {
                if (A_count > B_count) {
                    A_count--;
                    headA = headA->next;
                } else if (B_count > A_count) {
                    B_count--;
                    headB = headB->next;
                }
            }
            while (headA != headB) {
                headA = headA->next;
                headB = headB->next;
            }
            if (headA)
                return headA;
        }
        return nullptr;
    }
};

// 环形链表
/*给你一个链表的头节点 head ，判断链表中是否有环。

如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。注意：pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode* head) {
        if (head == nullptr || head->next == nullptr)
            return false;
        ListNode* s = head->next;
        ListNode* q = head->next->next;
        while (q != s) {
            s = s->next;
            if (q)
                q = q->next;
            if (q)
                q = q->next;
        }
        if (s)
            return true;
        return false;
    }
};